package jafer.tela;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Fase extends JPanel implements ActionListener {

	private Nave nave;
	private Image imagemFundo;
	private Timer timer;

	private boolean emJogo;

	private int[][] coordenadas = { { 580, 139 }, { 790, 150 }, { 930, 159 },
			{ 540, 90 }, { 810, 220 }, { 590, 80 }, { 920, 300 }, { 740, 180 },
			{ 920, 200 }, { 860, 20 }, { 780, 109 }, { 880, 239 }, };

	private List<Enemy> enemies;

	public Fase() {
		setFocusable(true); // foco na tela
		setDoubleBuffered(true); // não deixar vestigios da tela
									// anterior(riscos)
		addKeyListener(new TecladoAdapter()); // adiconar os movimentos

		ImageIcon imagem = new ImageIcon("res/espaco.jpg");
		imagemFundo = imagem.getImage();

		nave = new Nave();

		beginEnemies();

		emJogo = true;
		timer = new Timer(5, this); // este panel será repintado a cada 5
									// milissegundos
		timer.start();
	}

	public void beginEnemies() {
		
		enemies = new ArrayList<Enemy>();

		for (int i = 0; i < coordenadas.length; i++) {
			enemies.add(new Enemy(coordenadas[i][0], coordenadas[i][1]));
		}

	}

	public void checarColisoes() {

		Rectangle formaNave = nave.getBouds();
		Rectangle formaEnemy;
		Rectangle formaMissil;

		for (int i = 0; i < enemies.size(); i++) {

			Enemy tempEnemy = enemies.get(i);
			formaEnemy = tempEnemy.getBouds();

			if (formaNave.intersects(formaEnemy)) {
				nave.setVisible(false);
				tempEnemy.setVisible(false);
				emJogo = false;
			}
		}

		// missil

		List<Missil> misseis = nave.getMisseis();

		for (int i = 0; i < misseis.size(); i++) {
			Missil tempMissil = misseis.get(i);
			formaMissil = tempMissil.getBouds();

			for (int j = 0; j < enemies.size(); j++) {

				Enemy tempEnemy = enemies.get(j);
				formaEnemy = tempEnemy.getBouds();

				if (formaMissil.intersects(formaEnemy)) {
					tempEnemy.setVisible(false);
					tempMissil.setVisible(false);
				}
			}
		}

	}

	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D) g; // precisamos de um cast pois trataremos
										// de objetos 2d
		g2.drawImage(imagemFundo, 0, 0, null); // a imagem de fundo é fixa e não
												// necessita de parametro no
												// final

		if (emJogo) {

			g2.drawImage(nave.getImagem(), nave.getX(), nave.getY(), this); 
			List<Missil> misseis = nave.getMisseis();

			for (int i = 0; i < misseis.size(); i++) {

				Missil m = (Missil) misseis.get(i);
				g2.drawImage(m.getImagem(), m.getX(), m.getY(), this);

			}
			
			for (int i = 0; i < enemies.size(); i++) {

				Enemy en = (Enemy) enemies.get(i);
				g2.drawImage(en.getImagem(), en.getX(), en.getY(), this);

			}
			g2.setColor(Color.WHITE);
			g2.drawString("INIMIGOS: " + enemies.size(), 5, 15);

		} else {
			ImageIcon fimJogo = new ImageIcon("res/game_over.jpg");
			g2.drawImage(fimJogo.getImage(), 0, 0, null);
		}

		g.dispose();
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (enemies.size() == 0) {

			emJogo = false;

		}

		List<Missil> misseis = nave.getMisseis();

		for (int i = 0; i < misseis.size(); i++) {

			Missil m = (Missil) misseis.get(i);
			if (m.isVisible()) {
				m.mexer();
			} else {
				misseis.remove(i);
			}
		}

		for (int i = 0; i < enemies.size(); i++) {

			Enemy en = (Enemy) enemies.get(i);
			if (en.isVisible()) {
				en.mexer();
			} else {
				enemies.remove(i);
			}
		}
		nave.mexer();
		checarColisoes();
		repaint();

	}

	private class TecladoAdapter extends KeyAdapter {
		
		

		@Override
		public void keyPressed(KeyEvent e) {
			
			if(e.getKeyCode() == KeyEvent.VK_ENTER){
				emJogo = true;
				nave = new Nave();
				beginEnemies();
			}

			nave.keyPressed(e);
		}

		@Override
		public void keyReleased(KeyEvent e) {

			nave.keyReleased(e);
		}

	}

}
